package com.roden.study.redis.config;

import lombok.extern.slf4j.Slf4j;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * LRU（Least Recently Used）和LFU（Least Frequently Used）是两种常见的缓存淘汰策略，用于在缓存空间不足时确定要被替换的缓存项。
 * LRU（Least Recently Used）：LRU算法的基本思想是根据缓存项的访问时间来淘汰最近最少使用的缓存项。当需要淘汰缓存项时，会选择最久未被访问的缓存项进行替换。LRU算法比较适合那些访问模式有局部性的场景，因为被访问过的缓存项可能在未来会被再次访问。
 * LFU（Least Frequently Used）：LFU算法的基本思想是根据缓存项的访问频率来淘汰最不经常使用的缓存项。当需要淘汰缓存项时，会选择访问次数最少的缓存项进行替换。LFU算法适合那些访问频率比较稳定的场景，可以保留那些被频繁访问的缓存项。
 * 总的来说，LRU更关注最近的访问情况，而LFU更关注访问频率。在实际应用中，选择LRU还是LFU取决于具体的业务场景和数据访问模式。
 * LRU (Least recently used) 最近最少使用，如果数据最近被访问过，那么将来被访问的几率也更高。
 * LFU (Least frequently used) 最不经常使用，如果一个数据在最近一段时间内使用次数很少，那么在将来一段时间内被使用的可能性也很小。
 * FIFO (Fist in first out) 先进先出， 如果一个数据最先进入缓存中，则应该最早淘汰掉。
 * @author Roden
 *
 * 查找hash 增删链表
 */
@Slf4j
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
    private int cacheSize;
    public LRUCache(int cacheSize){
        super(16,(float)0.75,true);
        this.cacheSize=cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
        return size()>cacheSize;
    }

    public static void main(String[] args) {
        LRUCache<String, Integer> cache = new LRUCache<>(10);
        for (int i = 0; i < 10; i++) {
            cache.put("k" + i, i);
        }
        log.info("all cache :{}",cache);
        cache.get("k3");
        log.info("get k3 :{}", cache);
        cache.get("k4");
        log.info("get k4 :{}", cache);
        cache.get("k4");
        log.info("get k4 :{}", cache);
        cache.put("k" + 10, 10);
        log.info("After running the LRU algorithm cache :{}", cache);
    }
}
